package co.edu.uniquindio.ondas.negocio;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import co.edu.uniquindio.ondas.daos.AdministradorDAO;
import co.edu.uniquindio.ondas.daos.AsesorDAO;
import co.edu.uniquindio.ondas.daos.ComentarioAsesorDAO;
import co.edu.uniquindio.ondas.daos.ConsultaDAO;
import co.edu.uniquindio.ondas.daos.ConvocatoriaDAO;
import co.edu.uniquindio.ondas.daos.EstudianteDAO;
import co.edu.uniquindio.ondas.daos.EvaluacionProyectosDAO;
import co.edu.uniquindio.ondas.daos.EvaluadorDAO;
import co.edu.uniquindio.ondas.daos.GrupoDAO;
import co.edu.uniquindio.ondas.daos.InstitucionDAO;
import co.edu.uniquindio.ondas.daos.InvestigacionDAO;
import co.edu.uniquindio.ondas.daos.LineaTematicaDAO;
import co.edu.uniquindio.ondas.daos.MunicipioDAO;
import co.edu.uniquindio.ondas.daos.RespuestaConsultaDAO;
import co.edu.uniquindio.ondas.daos.SedeDAO;
import co.edu.uniquindio.ondas.daos.ZonaDAO;
import co.edu.uniquindio.ondas.daos.criterio.Criterio;
import co.edu.uniquindio.ondas.daos.criterio.Tipo;
import co.edu.uniquindio.ondas.dtos.InvestigacionDTO;
import co.edu.uniquindio.ondas.dtos.ResumenConsultaDTO;
import co.edu.uniquindio.ondas.dtos.ResumenEvaluacionSeleccionDTO;
import co.edu.uniquindio.ondas.dtos.ResumenHistorialAsesorDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInstitucionDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionAsesorDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionDTO;
import co.edu.uniquindio.ondas.entidades.Administrador;
import co.edu.uniquindio.ondas.entidades.Asesor;
import co.edu.uniquindio.ondas.entidades.Bitacora1Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora2;
import co.edu.uniquindio.ondas.entidades.Bitacora2Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora3;
import co.edu.uniquindio.ondas.entidades.Bitacora3Maestro;
import co.edu.uniquindio.ondas.entidades.Consulta;
import co.edu.uniquindio.ondas.entidades.Convocatoria;
import co.edu.uniquindio.ondas.entidades.Estudiante;
import co.edu.uniquindio.ondas.entidades.EvaluacionProyectos;
import co.edu.uniquindio.ondas.entidades.Evaluador;
import co.edu.uniquindio.ondas.entidades.Institucion;
import co.edu.uniquindio.ondas.entidades.Investigacion;
import co.edu.uniquindio.ondas.entidades.LineaTematica;
import co.edu.uniquindio.ondas.entidades.Maestro;
import co.edu.uniquindio.ondas.entidades.Municipio;
import co.edu.uniquindio.ondas.entidades.RespuestaConsulta;
import co.edu.uniquindio.ondas.entidades.Sede;
import co.edu.uniquindio.ondas.entidades.Zona;

/**
 * Session Bean implementation class AdministradorEJB
 * Implementacion del EJB Administrador
 */
@Stateless
public class AdministradorEJB implements AdministradorEJBRemote,
		AdministradorEJBLocal {

	/**
	 *  Manejador de la persistencia 
	 */
	@PersistenceContext(unitName = "proyectoEJB")
	protected EntityManager entityManager;

	/**
	 * DAO del Administrador
	 */
	private AdministradorDAO administradorDAO;
	/**
	 * DAO del Municipio
	 */
	private MunicipioDAO municipioDAO;
	/**
	 * DAO del Asesor
	 */
	private AsesorDAO asesorDAO;
	/**
	 * DAO de la Institucion
	 */
	private InstitucionDAO institucionDAO;
	/**
	 * DAO de la Zona
	 */
	private ZonaDAO zonaDAO;
	/**
	 * DAO de la Sede
	 */
	private SedeDAO sedeDAO;
	/**
	 * DAO del evaluador
	 */
	private EvaluadorDAO evaluadorDAO;
	/**
	 * DAO de la investigacion
	 */
	private InvestigacionDAO investigacionDAO;
	/**
	 * DAO de la evaluacion de Proyectos
	 */
	private EvaluacionProyectosDAO evaluacionProyectosDAO;
	/**
	 * DAO de la linea tematica	
	 */
	private LineaTematicaDAO lineaTematicaDAO;
	/**
	 * DAO de la consulta
	 */
	private ConsultaDAO consultaDAO;
	/**
	 * DAO de la Respuestas a Consutar
	 */
	private RespuestaConsultaDAO respuestaConsultaDAO;
	/**
	 * DAO del Grupo
	 */
	private GrupoDAO grupoDAO;
	/**
	 * DAO del Estudiante
	 */
	private EstudianteDAO estudianteDAO;
	/**
	 * DAO del Comentario del Asesor
	 */
	private ComentarioAsesorDAO comentarioAsesorDAO;
	/**
	 * DAO de la convocatoria
	 */
	private ConvocatoriaDAO convocatoriaDAO;

	/**
	 * Default constructor.
	 */
	public AdministradorEJB() {
		// TODO Auto-generated constructor stub
	}

	public boolean inicioSesion(String identificacion, String clave) {
		boolean autenticado = false;
		administradorDAO = new AdministradorDAO(entityManager);
		Administrador administrador = administradorDAO
				.findByKey(identificacion);

		if (administrador != null) {
			if (administrador.getPassword().equals(clave)) {
				autenticado = true;
			}
		}
		return autenticado;
	}

	public boolean crearMunicipio(Municipio municipio) {
		boolean creado = false;
		boolean existe = false;
		municipioDAO = new MunicipioDAO(entityManager);

		municipio.setNombre(municipio.getNombre().toUpperCase());

		List<Municipio> municipios = municipioDAO.getAll();
		if (municipios.size() != 0) {
			for (int i = 0; i < municipios.size(); i++) {
				if (municipios.get(i).getNombre().equals(municipio.getNombre())) {
					existe = true;
					break;
				}
			}
		}

		if (!existe) {
			municipioDAO.insert(municipio);
			creado = true;
		}

		return creado;
	}

	public boolean crearAsesor(Asesor asesor, String linea) {
		boolean creado = false;
		boolean existe = false;
		asesorDAO = new AsesorDAO(entityManager);
		lineaTematicaDAO = new LineaTematicaDAO(entityManager);

		List<Asesor> asesores = asesorDAO.getAll();
		for (Asesor asesor2 : asesores) {
			if (asesor2.getIdentificacion().equals(asesor.getIdentificacion())) {
				existe = true;
				break;
			}
		}

		if (!existe) {
			LineaTematica lineaTematica = lineaTematicaDAO
					.obtenerLineaTematica(linea);
			asesor.setLineaTematica(lineaTematica);
			asesorDAO.insert(asesor);
			creado = true;
		}

		return creado;
	}

	public boolean crearEvaluador(Evaluador nuevoEvaluador, String linea) {
		boolean creado = false;
		boolean existe = false;
		evaluadorDAO = new EvaluadorDAO(entityManager);
		lineaTematicaDAO = new LineaTematicaDAO(entityManager);

		List<Evaluador> evaluadores = evaluadorDAO.getAll();
		for (Evaluador evaluador : evaluadores) {
			if (evaluador.getIdentificacion().equals(
					nuevoEvaluador.getIdentificacion())) {
				existe = true;
				break;
			}
		}

		if (!existe) {
			LineaTematica lineaTematica = lineaTematicaDAO
					.obtenerLineaTematica(linea);
			nuevoEvaluador.setLineaTematica(lineaTematica);
			evaluadorDAO.insert(nuevoEvaluador);
			creado = true;
		}

		return creado;
	}

	public List<String> getListaMunicipios() {
		municipioDAO = new MunicipioDAO(entityManager);
		return municipioDAO.getListaMunicipios();
	}

	public boolean crearIntitucion(Institucion institucion,
			String nombreMunicipio, String nombreZona) {
		boolean creado = false;
		boolean existe = false;
		municipioDAO = new MunicipioDAO(entityManager);
		institucionDAO = new InstitucionDAO(entityManager);
		zonaDAO = new ZonaDAO(entityManager);

		Municipio municipio = municipioDAO.getMunicipio(nombreMunicipio);
		Zona zona = zonaDAO.getZona(nombreZona);

		institucion.setNombre(institucion.getNombre().toUpperCase());

		List<Institucion> instituciones = institucionDAO.getAll();

		for (Institucion institucion2 : instituciones) {
			if (institucion2.getNombre().equals(institucion.getNombre())
					&& institucion2.getMunicipio().getNombre()
							.equals(municipio.getNombre())
					&& institucion2.getZona().getNombre().equals(nombreZona)) {
				existe = true;
				break;
			}
		}

		if (!existe) {
			institucion.setMunicipio(municipio);
			institucion.setZona(zona);
			institucionDAO.insert(institucion);
			creado = true;
		}

		return creado;
	}

	public List<String> getListaInstituciones() {
		institucionDAO = new InstitucionDAO(entityManager);
		return institucionDAO.getListaInstituciones();
	}

	public List<String> getListaZonas() {
		zonaDAO = new ZonaDAO(entityManager);
		return zonaDAO.getListaZonas();
	}

	public boolean crearSede(Sede sede, String nombreInstitucion,
			String nombreMunicipio) {

		institucionDAO = new InstitucionDAO(entityManager);

		sedeDAO = new SedeDAO(entityManager);

		boolean creado = false;
		boolean existe = false;

		sede.setNombre(sede.getNombre().toUpperCase());

		Institucion institucion = institucionDAO.getInstitucion(
				nombreInstitucion, nombreMunicipio);
		System.out.println(institucion.getNombre() + " "
				+ institucion.getMunicipio().getNombre());

		List<Sede> sedes = sedeDAO.getAll();

		for (Sede sede2 : sedes) {
			if (sede2.getNombre().equals(sede.getNombre())
					&& sede2.getInstitucion().getNombre()
							.equals(nombreInstitucion)) {
				existe = true;
				break;
			}
		}

		if (!existe) {
			sede.setInstitucion(institucion);
			sedeDAO.insert(sede);
			creado = true;
		}

		return creado;
	}

	public List<Institucion> getInstituciones() {
		institucionDAO = new InstitucionDAO(entityManager);
		return institucionDAO.getAll();
	}

	public boolean editarIntitucion(Institucion institucion,
			String nombreMunicipio, String nombreZona) {
		municipioDAO = new MunicipioDAO(entityManager);
		institucionDAO = new InstitucionDAO(entityManager);
		zonaDAO = new ZonaDAO(entityManager);

		boolean editado = false;

		Municipio municipio2 = municipioDAO.getMunicipio(nombreMunicipio);
		institucion.setMunicipio(municipio2);

		Zona zona = zonaDAO.getZona(nombreZona);
		institucion.setZona(zona);

		if (!institucion.getNombre().equals("")) {
			institucionDAO.update(institucion);
			editado = true;
		}

		return editado;
	}

	public List<Sede> getSedes() {
		sedeDAO = new SedeDAO(entityManager);
		return sedeDAO.getAll();
	}

	public List<String> getListaNombresInstituciones(String municipio,
			String zona) {
		institucionDAO = new InstitucionDAO(entityManager);

		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIO, municipio));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONA, zona));
		}

		return institucionDAO.getListaNombres(criterios);
	}

	public long obtenerTotalPaginasIntituciones(int tamPagina,
			String municipio, String nombre, String zona) {
		institucionDAO = new InstitucionDAO(entityManager);
		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIO, municipio));
		}

		if (!nombre.equals("")) {
			criterios.add(new Criterio(Tipo.NOMBRE, nombre));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONA, zona));
		}

		return institucionDAO.obtenerTotalPaginasInstituciones(tamPagina,
				criterios);
	}

	public List<Institucion> obtenerPaginaIntituciones(int numPag,
			int tamanoPag, String municipio, String nombre, String zona) {
		institucionDAO = new InstitucionDAO(entityManager);
		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIO, municipio));
		}

		if (!nombre.equals("")) {
			criterios.add(new Criterio(Tipo.NOMBRE, nombre));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONA, zona));
		}

		return institucionDAO
				.obtenerInstituciones(numPag, tamanoPag, criterios);
	}

	public List<String> obtenerListaSedes() {
		sedeDAO = new SedeDAO(entityManager);
		return sedeDAO.obtenerListaSedes();
	}

	public long obtenerTotalPaginasSedes(int tamPagina, String municipio,
			String institucion, String sede, String zona) {
		sedeDAO = new SedeDAO(entityManager);
		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIOSEDE, municipio));
		}

		if (!institucion.equals("")) {
			criterios.add(new Criterio(Tipo.INSTITUCION, institucion));
		}

		if (!sede.equals("")) {
			criterios.add(new Criterio(Tipo.SEDE, sede));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONA, zona));
		}

		for (Criterio criterio : criterios) {
			System.err.println(criterio.getArgumento());
		}
		return sedeDAO.obtenerTotalPaginasSede(tamPagina, criterios);
	}

	public List<Sede> obtenerPaginaSedes(int numPag, int tamanoPag,
			String municipio, String institucion, String sede, String zona) {
		sedeDAO = new SedeDAO(entityManager);
		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIOSEDE, municipio));
		}

		if (!institucion.equals("")) {
			criterios.add(new Criterio(Tipo.INSTITUCION, institucion));
		}

		if (!sede.equals("")) {
			criterios.add(new Criterio(Tipo.SEDE, sede));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONA, zona));
		}

		for (Criterio criterio : criterios) {
			System.err.println(criterio.getArgumento());
		}
		return sedeDAO.buscarSede(numPag, tamanoPag, criterios);
	}

	public List<String> obtenerListaSedesInstitucion(String municipio,
			String institucion, String zona) {

		sedeDAO = new SedeDAO(entityManager);
		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIOSEDE, municipio));
		}

		if (!institucion.equals("")) {
			criterios.add(new Criterio(Tipo.INSTITUCION, institucion));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONA, zona));
		}
		return sedeDAO.obtenerListaSedesInstitucion(criterios);
	}

	public boolean editarSede(Sede sede, String nombreInstitucion,
			String nombreMunicipio) {
		sedeDAO = new SedeDAO(entityManager);
		institucionDAO = new InstitucionDAO(entityManager);
		boolean editado = false;

		if (!nombreInstitucion.equals("")) {
			Institucion institucion = institucionDAO.getInstitucion(
					nombreInstitucion, nombreMunicipio);

			sede.setInstitucion(institucion);
		}

		if (!sede.getNombre().equals("")) {
			sedeDAO.update(sede);
			editado = true;
		}

		return editado;
	}

	public List<Asesor> getListaAsesores() {
		asesorDAO = new AsesorDAO(entityManager);
		return asesorDAO.getListaAsesores();
	}

	public List<ResumenInvestigacionAsesorDTO> getResumenInvestigacion(
			String idAsesor) {
		asesorDAO = new AsesorDAO(entityManager);
		investigacionDAO = new InvestigacionDAO(entityManager);
		return investigacionDAO.getinvAsesor(idAsesor);
	}

	public boolean eliminarInvestigacionAsesor(ResumenInvestigacionAsesorDTO inv) {

		investigacionDAO = new InvestigacionDAO(entityManager);

		boolean update = false;

		Investigacion investigacion = investigacionDAO.findByKey(inv
				.getIdInvestigacion());

		if (investigacion != null) {
			investigacion.setAsesor(null);
			investigacionDAO.update(investigacion);
			update = true;
		}

		return update;
	}

	public List<ResumenInvestigacionDTO> getlistaInvestigacionEvaluar() {
		investigacionDAO = new InvestigacionDAO(entityManager);
		return investigacionDAO.getResumenInvestigacion();
	}

	public Bitacora2 getBitacora2(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora2> listBitacora2 = investigacionDAO
				.getBitacota2Investigacion(idInvestigacion);
		Bitacora2 bitacora2 = new Bitacora2();

		if (listBitacora2.size() != 0) {
			bitacora2 = listBitacora2.get(0);
		}
		return bitacora2;
	}

	public Bitacora3 getBitacora3(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora3> listbBitacora3 = investigacionDAO
				.getBitacota3Investigacion(idInvestigacion);
		Bitacora3 bitacora3 = new Bitacora3();

		if (listbBitacora3.size() != 0) {
			bitacora3 = listbBitacora3.get(0);
		}
		return bitacora3;
	}

	public Bitacora1Maestro getBitacora1Maestro(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora1Maestro> listBitacora1Maestro = investigacionDAO
				.getBitacota1MaestroInvestigacion(idInvestigacion);
		Bitacora1Maestro bitacora1Maestro = new Bitacora1Maestro();

		if (listBitacora1Maestro.size() != 0) {
			bitacora1Maestro = listBitacora1Maestro.get(0);
		}
		return bitacora1Maestro;
	}

	public Bitacora2Maestro getBitacora2Maestro(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora2Maestro> listBitacora2Maestro = investigacionDAO
				.getBitacota2MaestroInvestigacion(idInvestigacion);
		Bitacora2Maestro bitacora2Maestro = new Bitacora2Maestro();

		if (listBitacora2Maestro.size() != 0) {
			bitacora2Maestro = listBitacora2Maestro.get(0);
		}
		return bitacora2Maestro;
	}

	public Bitacora3Maestro getBitacora3Maestro(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora3Maestro> listBitacora3Maestro = investigacionDAO
				.getBitacota3MaestroInvestigacion(idInvestigacion);
		Bitacora3Maestro bitacora3Maestro = new Bitacora3Maestro();

		if (listBitacora3Maestro.size() != 0) {
			bitacora3Maestro = listBitacora3Maestro.get(0);
		}
		return bitacora3Maestro;
	}

	public List<Evaluador> obtenerListaEvaluador(long idLinea) {
		evaluadorDAO = new EvaluadorDAO(entityManager);
		return evaluadorDAO.obtenerEvaluadoresLinea(idLinea);
	}

	public boolean asignarEvaluador(long idInvestigacion, String idEvaluador) {

		investigacionDAO = new InvestigacionDAO(entityManager);
		evaluadorDAO = new EvaluadorDAO(entityManager);
		evaluacionProyectosDAO = new EvaluacionProyectosDAO(entityManager);

		boolean asignado = false;
		boolean existe = false;

		Investigacion investigacion = investigacionDAO
				.findByKey(idInvestigacion);
		Evaluador evaluador = evaluadorDAO.findByKey(idEvaluador);

		EvaluacionProyectos evaluacionProyectos = new EvaluacionProyectos();

		List<EvaluacionProyectos> listaEvaluacion = evaluacionProyectosDAO
				.getAll();

		if (listaEvaluacion.size() != 0) {
			for (EvaluacionProyectos evaluacionProyectos2 : listaEvaluacion) {
				if (evaluacionProyectos2.getInvestigacion().getIdentificacion() == idInvestigacion) {
					existe = true;
					break;
				}
			}
		}

		if (investigacion != null && evaluador != null) {
			if (!existe) {
				// evaluacionProyectos.setInvestigacion(investigacion);
				evaluacionProyectos.setEvaluador(evaluador);
				evaluacionProyectosDAO.insert(evaluacionProyectos);
				investigacion.setEvaluacionProyectos(evaluacionProyectos);
				investigacionDAO.update(investigacion);
				asignado = true;
			}
		}

		return asignado;
	}

	public List<ResumenEvaluacionSeleccionDTO> obtenerListaEvaluacionSeleccion() {
		evaluacionProyectosDAO = new EvaluacionProyectosDAO(entityManager);
		return evaluacionProyectosDAO.obtenerEvaluacionesASeleccionar();
	}

	public List<String> obtenerListaLineas() {
		lineaTematicaDAO = new LineaTematicaDAO(entityManager);
		return lineaTematicaDAO.obtenerListaLineas();
	}

	public boolean patrocinarInvestigacion(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		boolean seleccionado = false;

		Investigacion investigacion = investigacionDAO
				.findByKey(idInvestigacion);

		if (investigacion != null) {
			investigacion.setSeleccionado(true);
			investigacionDAO.update(investigacion);
			seleccionado = true;
		}

		return seleccionado;
	}

	public List<ResumenInvestigacionDTO> obtenerInvestigacionAsignarAsesor() {
		investigacionDAO = new InvestigacionDAO(entityManager);
		return investigacionDAO.obtenerInvestigacionAsignarAsesor();
	}

	public List<Asesor> obtenerAsesoresLinea(long idLinea) {
		asesorDAO = new AsesorDAO(entityManager);
		return asesorDAO.obtenerAsesoresLinea(idLinea);
	}

	public boolean asignarAsesorInvestigacion(Asesor asesor,
			long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		boolean asignado = false;

		Investigacion investigacion = investigacionDAO
				.findByKey(idInvestigacion);

		if (investigacion != null) {
			investigacion.setAsesor(asesor);
			investigacionDAO.update(investigacion);
			asignado = true;
		}

		return asignado;
	}

	public List<ResumenConsultaDTO> obtenerConsultasAdministrador() {
		consultaDAO = new ConsultaDAO(entityManager);
		return consultaDAO.obtenerConsultasAdministrador();
	}

	public boolean crearRespuestaConsulta(RespuestaConsulta respuesta,
			long idConsulta) {
		respuestaConsultaDAO = new RespuestaConsultaDAO(entityManager);
		consultaDAO = new ConsultaDAO(entityManager);
		boolean creada = false;

		Consulta consulta = consultaDAO.findByKey(idConsulta);

		if (consulta != null) {
			consulta.setContestada(true);
			consultaDAO.update(consulta);
			respuesta.setConsulta(consulta);
			respuestaConsultaDAO.insert(respuesta);
			creada = true;
		}
		return creada;
	}

	public Long obtenerTotalPaginasInvestigaciones(int tamPag,
			String seleccionado, String activo, String municipio,
			String institucion, String zona, String sede) {
		investigacionDAO = new InvestigacionDAO(entityManager);

		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!seleccionado.equals("")) {
			if (seleccionado.equals("Seleccionadas")) {
				seleccionado = "1";
			} else
				seleccionado = "0";

			criterios.add(new Criterio(Tipo.SELECCIONADA, seleccionado));
		}

		if (!activo.equals("")) {
			if (activo.equals("Activas")) {
				activo = "1";
			} else
				activo = "0";

			criterios.add(new Criterio(Tipo.ACTIVA, activo));
		}

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIOIN, municipio));
		}

		if (!sede.equals("")) {
			criterios.add(new Criterio(Tipo.SEDEIN, sede));
		}

		if (!institucion.equals("")) {
			criterios.add(new Criterio(Tipo.INSTITUCIONIN, institucion));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONAIN, zona));
		}

		return investigacionDAO.obtenerTotalPaginasInvestigaciones(tamPag,
				criterios);
	}

	public List<ResumenInvestigacionDTO> obtenerPaginaInvestigacion(int numPag,
			int tamanoPag, String seleccionado, String activo,
			String municipio, String institucion, String zona, String sede) {
		investigacionDAO = new InvestigacionDAO(entityManager);

		List<Criterio> criterios = new ArrayList<Criterio>();

		if (!seleccionado.equals("")) {
			if (seleccionado.equals("Seleccionadas")) {
				seleccionado = "1";
			} else
				seleccionado = "0";

			criterios.add(new Criterio(Tipo.SELECCIONADA, seleccionado));
		}

		if (!activo.equals("")) {
			if (activo.equals("Activas")) {
				activo = "1";
			} else
				activo = "0";

			criterios.add(new Criterio(Tipo.ACTIVA, activo));
		}

		if (!municipio.equals("")) {
			criterios.add(new Criterio(Tipo.MUNICIPIOIN, municipio));
		}

		if (!sede.equals("")) {
			criterios.add(new Criterio(Tipo.SEDEIN, sede));
		}

		if (!institucion.equals("")) {
			criterios.add(new Criterio(Tipo.INSTITUCIONIN, institucion));
		}

		if (!zona.equals("")) {
			criterios.add(new Criterio(Tipo.ZONAIN, zona));
		}

		return investigacionDAO.obtenerPaginaInvestigacion(numPag, tamanoPag,
				criterios);
	}

	public List<Estudiante> obtenerEstudiantesGrupo(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		return investigacionDAO.obtenerEstudiantesGrupo(idInvestigacion);
	}

	public List<Maestro> obtenerMaestrosGrupo(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		return investigacionDAO.obtenerMaestrosGrupo(idInvestigacion);
	}

	public List<ResumenInstitucionDTO> obtenerResumenSedes() {
		municipioDAO = new MunicipioDAO(entityManager);
		institucionDAO = new InstitucionDAO(entityManager);
		sedeDAO = new SedeDAO(entityManager);
		grupoDAO = new GrupoDAO(entityManager);
		estudianteDAO = new EstudianteDAO(entityManager);
		investigacionDAO = new InvestigacionDAO(entityManager);

		List<ResumenInstitucionDTO> resumen = new ArrayList<ResumenInstitucionDTO>();

		List<Sede> sedes = sedeDAO.listaSedes();
		for (Sede sede : sedes) {
			ResumenInstitucionDTO resDto = new ResumenInstitucionDTO();
			resDto.setSede(sede.getNombre());
			resDto.setInstitucion(sede.getInstitucion().getNombre());
			resDto.setMunicipio(sede.getInstitucion().getMunicipio()
					.getNombre());
			resDto.setNumeroInvestigaciones(investigacionDAO
					.numeroInvestigacioSede(sede.getIdentificacion()));
			resDto.setNumeroInvestigacionesSel(investigacionDAO
					.numeroInvestigacioSelSede(sede.getIdentificacion()));
			resDto.setNumeroEstudiantes(investigacionDAO
					.obtenerNumeroEstudiantesSede(sede.getIdentificacion()));
			resDto.setNumeroEstudiantesActivos(investigacionDAO
					.obtenerNumeroEstudiantesActivosSede(sede
							.getIdentificacion()));
			resumen.add(resDto);
		}

		return resumen;
	}

	public List<Asesor> obtenerAsesoresConInvestigaciones() {
		asesorDAO = new AsesorDAO(entityManager);
		return asesorDAO.obtenerAsesoresConInvestigaciones();
	}

	public List<ResumenHistorialAsesorDTO> obtenerHistorialAsesor(
			String idAsesor) {
		consultaDAO = new ConsultaDAO(entityManager);
		respuestaConsultaDAO = new RespuestaConsultaDAO(entityManager);
		comentarioAsesorDAO = new ComentarioAsesorDAO(entityManager);
		investigacionDAO = new InvestigacionDAO(entityManager);

		List<ResumenHistorialAsesorDTO> resumen = new ArrayList<ResumenHistorialAsesorDTO>();

		List<InvestigacionDTO> investigaciones = investigacionDAO
				.obtenerInvestigacionesHistorialAsesor(idAsesor);

		for (InvestigacionDTO investigacionDTO : investigaciones) {
			ResumenHistorialAsesorDTO rAsesorDTO = new ResumenHistorialAsesorDTO();

			rAsesorDTO.setInvestigacion(investigacionDTO
					.getNombreInvestigacion());
			rAsesorDTO.setGrupo(investigacionDTO.getGrupo());
			rAsesorDTO.setNumeroConsultas(consultaDAO
					.obtenerNumeroConsultasInvestigacion(investigacionDTO
							.getIdInvestigacion()));
			rAsesorDTO.setNumeroRespuestas(respuestaConsultaDAO
					.obtenerNumeroRespuestasInvestigacion(investigacionDTO
							.getIdInvestigacion()));
			rAsesorDTO
					.setNumeroComentarios(comentarioAsesorDAO
							.obtenerNumeroComentariosAsesorInvestigacion(investigacionDTO
									.getIdInvestigacion()));

			resumen.add(rAsesorDTO);
		}

		return resumen;
	}

	public boolean crearConvocatoria(Convocatoria convocatoria) {
		convocatoriaDAO = new ConvocatoriaDAO(entityManager);
		boolean creada = false;
		boolean activa = false;

		List<Convocatoria> convocatorias = convocatoriaDAO.getAll();
		for (Convocatoria convocatoria2 : convocatorias) {
			if (convocatoria2.isEstado() == true) {
				activa = true;
				break;
			}
		}

		if (!activa) {
			convocatoria.setEstado(true);
			convocatoriaDAO.insert(convocatoria);
			creada = true;
		}

		return creada;
	}

	public boolean editarConvocatoria(Convocatoria convocatoria, String estado) {
		convocatoriaDAO = new ConvocatoriaDAO(entityManager);
		boolean editada = false;
		boolean activa = false;

		if (convocatoria.isEstado() == true) {
			Convocatoria convocatoria2 = convocatoriaDAO.findByKey(convocatoria
					.getIdentificacion());
			if (convocatoria2 != null) {
				if (estado.equals("Activa") || estado.equals("")) {
					convocatoria.setEstado(true);
				} else if (estado.equals("Inactiva")) {
					convocatoria.setEstado(false);
				}

				convocatoriaDAO.update(convocatoria);
				editada = true;
			}
		} else if (convocatoria.isEstado() == false) {

			if (estado.equals("Inactiva")) {
				Convocatoria convocatoria2 = convocatoriaDAO
						.findByKey(convocatoria.getIdentificacion());
				if (convocatoria2 != null) {
					convocatoria.setEstado(false);

					convocatoriaDAO.update(convocatoria);
					editada = true;
				}
			} else if (estado.equals("Activa")) {
				List<Convocatoria> listaConvocatorias = convocatoriaDAO
						.getAll();
				for (Convocatoria convocatoria2 : listaConvocatorias) {
					if (convocatoria2.isEstado() == true) {
						activa = true;
						break;
					}
				}

				if (!activa) {
					Convocatoria convocatoria2 = convocatoriaDAO
							.findByKey(convocatoria.getIdentificacion());
					if (convocatoria2 != null) {
						if (estado.equals("Activa") || estado.equals("")) {
							convocatoria.setEstado(true);
						} else if (estado.equals("Inactiva")) {
							convocatoria.setEstado(false);
						}

						convocatoriaDAO.update(convocatoria);
						editada = true;
					}
				}
			}
		}
		return editada;
	}

	public boolean eliminarConvocatoria(Convocatoria convocatoria) {
		convocatoriaDAO = new ConvocatoriaDAO(entityManager);
		boolean eliminada = false;

		Convocatoria convocatoria2 = convocatoriaDAO.findByKey(convocatoria
				.getIdentificacion());

		if (convocatoria2 != null) {
			convocatoriaDAO.remove(convocatoria);
			eliminada = true;
		}
		return eliminada;
	}

	public List<Convocatoria> obtenerConvocatorias() {
		convocatoriaDAO = new ConvocatoriaDAO(entityManager);
		List<Convocatoria> convocatorias = convocatoriaDAO.getAll();
		return convocatorias;
	}

	public boolean eliminarAsesor(Asesor asesor) {
		// TODO Auto-generated method stub
		return false;
	}

}
